#ifndef RL_RS485_FSFX_H
#define RL_RS485_FSFX_H

#include <Arduino.h>
#include <SoftwareSerial.h>

class RS485_FSFX : public SoftwareSerial {
public:
    // 构造函数：指定RX、TX引脚，初始化超时和调试模式
    RS485_FSFX(short rxPin, short txPin) : SoftwareSerial(rxPin, txPin) {
        _timeout = 1000;  // 默认超时时间1000ms
        _debugMode = false;  // 默认关闭调试模式
    };

    void requestfs();       // 发送风速请求指令
    float readfs();         // 读取风速值（返回-1=超时，-2=CRC错误）
    int readfs_level();     // 读取风速等级（返回-1=读取失败）
    void requestfx();       // 发送风向请求指令
    float readfx();         // 读取风向值（返回-1=超时，-2=CRC错误）
    bool readfx_dir(int dir);// 判断风向是否匹配指定方向（失败返回false）

    // 新增：设置读取超时时间（ms）
    void setTimeout(unsigned long timeout) { _timeout = timeout; }
    // 新增：开启/关闭调试模式（输出原始数据和状态）
    void setDebugMode(bool enable) { _debugMode = enable; }

private:
    byte fs_request[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};// 风速指令
    byte fx_request[8] = {0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xc4, 0x38};// 风向指令
    byte fs_buf[7];        // 风速接收缓冲区（7字节）
    byte fx_buf[9];        // 风向接收缓冲区（9字节）

    // 新增：私有成员
    unsigned long _timeout;  // 读取超时时间
    bool _debugMode;         // 调试模式标志

    // 新增：CRC16校验计算（Modbus RTU标准）
    uint16_t crc16(const byte* data, uint8_t len);
};

#endif